"""
__author__ = '霍格沃兹测试开发学社'
__desc__ = '更多测试开发技术探讨，请访问：https://ceshiren.com/t/topic/15860'
"""
import json
import os

import pymysql
import yaml
from genson import SchemaBuilder
from jsonschema.validators import validate

from interface_L3.utils.log_util import logger


class Utils:

    @classmethod
    def get_yaml_data(cls, file_path):
        '''
        读取 yaml 文件内容
        file_path: 要读取的 yaml 文件的路径
        '''
        with open(file_path, encoding="utf-8") as f:
            datas = yaml.safe_load(f)
        return datas


    @classmethod
    def query_db(cls, sql, database_info):
        '''
        sql：要执行的 sql 语句
        database_info: 数据库相关信息，字典格式
           host
           port
           user
           password
           charset
        查询数据库
        '''
        # 创建连接
        logger.info(f'要连接的数据库为 {database_info}')
        conn = pymysql.Connect(**database_info)
        # 创建游标
        cursor = conn.cursor()
        # 执行 sql 语句
        logger.info(f"要执行的 sql 语句为 {sql}")
        cursor.execute(sql)
        # 获取查询结果
        datas = cursor.fetchall()
        logger.info(f'数据库查询结果为 {datas}')
        # 关闭游标
        cursor.close()
        # 关闭连接
        conn.close()
        return datas

    @classmethod
    def genarate_schema(cls, json_obj, file_path):
        '''
        json_obj: 要生成模版的 json 对象
        生成 jsonschema 模版
        '''
        builder = SchemaBuilder()
        # 把预期响应添加到 builder 当中
        builder.add_object(json_obj)
        # 生成 jsonschema
        schema_content = builder.to_schema()
        logger.info(f'生成的模版内容为 {schema_content}')
        # 写入 json 文件
        with open(file_path, "w", encoding="utf-8") as f:
            json.dump(schema_content, f)

    @classmethod
    def schema_validate(cls, json_obj, schema):
        '''
        json_obj: 获取到的 json 格式的响应
        schema: 已经生成的 schema 模版
        对比 json 数据与 jsonschema 是否一致
        '''
        try:
            # 对比 json 对象与 schema 模版是否一致，不一致会抛出异常
            validate(instance=json_obj, schema=schema)
            return True
        except Exception as e:
            logger.info(f"schema 校验异常 {e}")
            return False

    @classmethod
    def get_file_path(self):
        '''
        获取当前文件的绝对路径
        :return:
        '''
        return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


